home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / DEMOS / 3D_DEMO_3 / !Demo3 / c / demo3 next >
Text File  |  1992-02-04  |  6KB  |  285 lines

  1. /******************************************************************************
  2. *                                                                             *
  3. *    grp.c                                                                    *
  4. *                                                                             *
  5. ******************************************************************************/
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include <swis.h>
  11. #include <os.h>
  12. #include <bbc.h>
  13. #include "GrpLib.h"
  14.  
  15. void SetTxtCurPos(int x, int y)
  16. {
  17.   os_error *err;
  18.   err=bbc_tab(x,y);
  19. }
  20.  
  21. int GetClock(void)
  22. {
  23.   os_regset regs;
  24.   char blk[16];
  25.   int  i=0;
  26.   int  t=0;
  27.  
  28.   regs.r[0]=0x01; /* read system clock */
  29.   regs.r[1]=(int)blk;
  30.   os_swi(OS_Word,®s);
  31.  
  32.   t+=(int)(blk[i++])<<0;
  33.   t+=(int)(blk[i++])<<8;
  34.   t+=(int)(blk[i++])<<16;
  35.   t+=(int)(blk[i++])<<24;
  36.  
  37.   return(t);
  38. }
  39.  
  40. void SetMouseArea(int left, int bottom, int right, int top)
  41. {
  42.   os_regset regs;
  43.   char blk[16];
  44.   int  i=0;
  45.  
  46.   blk[i++]=(char) 1; /* define mouse co-ordinate bounding box */
  47.   blk[i++]=(char) (left   & 0xFF);  blk[i++]=(char) ((left  >>8) & 0xFF);
  48.   blk[i++]=(char) (bottom & 0xFF);  blk[i++]=(char) ((bottom>>8) & 0xFF);
  49.   blk[i++]=(char) (right  & 0xFF);  blk[i++]=(char) ((right >>8) & 0xFF);
  50.   blk[i++]=(char) (top    & 0xFF);  blk[i++]=(char) ((top   >>8) & 0xFF);
  51.  
  52.   regs.r[0]=0x15; /* define pointer and mouse parameters */
  53.   regs.r[1]=(int)blk;
  54.   os_swi(OS_Word,®s);
  55. }
  56.  
  57. void SetMousePos(int x, int y)
  58. {
  59.   os_regset regs;
  60.   char blk[16];
  61.   int  i=0;
  62.  
  63.   blk[i++]=(char) 3; /* set mouse position */
  64.   blk[i++]=(char) (x & 0xFF);  blk[i++]=(char) ((x>>8) & 0xFF);
  65.   blk[i++]=(char) (y & 0xFF);  blk[i++]=(char) ((y>>8) & 0xFF);
  66.  
  67.   regs.r[0]=0x15; /* define pointer and mouse parameters */
  68.   regs.r[1]=(int)blk;
  69.   os_swi(OS_Word,®s);
  70. }
  71.  
  72. void ReadMouse(int *x, int *y, int *b)
  73. {
  74.   os_regset regs;
  75.  
  76.   os_swi(OS_Mouse,®s);
  77.     *x=regs.r[0];
  78.     *y=regs.r[1];
  79.     *b=regs.r[2];
  80. }
  81.  
  82. int Inkey()
  83. {
  84.   os_regset regs;
  85.  
  86.   regs.r[0] = 129;  /* kb read */
  87.   regs.r[1] = 0; /* wait time low byte */
  88.   regs.r[2] = 0; /* wait time high byte */
  89.   os_swi(OS_Byte,®s);
  90.   return( (regs.r[2]==0) ? regs.r[1] : 0);
  91. }
  92.  
  93.  
  94.  
  95. int main()
  96. {
  97.   int  i;
  98.  
  99.   int  time=0;
  100.  
  101.   int  msx,msy,msbut,msorgx,msorgy;
  102.   int  kbbut;
  103.  
  104.   int  stp=10;
  105.   int  ra,rs,rt,x,y,z,v;
  106.  
  107.  
  108.   char    *spr1,*spr2,*spr3;
  109.   Object  *cvx1,*cvx2,*cvx3;
  110.   Object  *sch1,*sch2,*sch3;
  111.  
  112.   Object  *ObjTab[4];
  113.   int     vtpos[4][6];
  114.  
  115.   Object  *obs;
  116.  
  117.   int     curobj;
  118.  
  119.   Envi    *envi;
  120.  
  121.  
  122.  
  123.   InitGrp();
  124.   Change2DParm(0,0,319,255);
  125.   Change3DParm(80,64,320);
  126.  
  127.   obs  = MakeObj("",                    NULL,0);
  128.  
  129.   cvx1 = MakeObj("<GrpObj$Dir>.crayon1", CVX ,1);
  130.   cvx2 = MakeObj("<GrpObj$Dir>.crayon2", CVX ,0);
  131.  
  132.   sch1 = MakeObj("<GrpObj$Dir>.plane1",  SCH ,0);
  133.   sch2 = MakeObj("<GrpObj$Dir>.plane2",  SCH ,1);
  134.   sch3 = MakeObj("<GrpObj$Dir>.sub8",    SCH ,2);
  135.  
  136.  
  137.   ObjTab[0]=cvx1;
  138.   ObjTab[1]=sch1;
  139.   ObjTab[2]=sch2;
  140.   ObjTab[3]=sch3;
  141.  
  142.   PlaceObj(obs,0,0,0,0,0,-2000);
  143.  
  144.   envi = MakeEnvi(1, 0, 0x50);
  145.   MkVec4(envi->DirecSrc[0],   128,   128,   128,      0);
  146.   MkVec4(envi->PonctSrc[0],     0,     200,  0, 100000);
  147.  
  148.  
  149.  
  150.   SetMouseArea(0,0,1279,1023);
  151.   SetMousePos(640,512);
  152.   ReadMouse(&msorgx,&msorgy,&msbut);
  153.  
  154.   v=0;
  155.   curobj=0;
  156.  
  157.   for(i=0;i<4;i++) {
  158.     vtpos[i][0]=0;
  159.     vtpos[i][1]=0;
  160.     vtpos[i][2]=0;
  161.     vtpos[i][3]=0;
  162.     vtpos[i][4]=0;
  163.     vtpos[i][5]=0;
  164.     PlaceObj(ObjTab[i], 0,0,0, 0,0,0);
  165.   }
  166.  
  167.   while (1==1) {
  168.  
  169.     SetTxtCurPos(0,0); printf("%d",GetClock()-time);
  170.  
  171.     time=GetClock();
  172.  
  173.     x=y=z=ra=rs=rt=0;
  174.  
  175.     for(i=0;i<4;i++) {
  176.       switch(i) {
  177.         case 0:  Change2DParm(  0,  0,159,127); break;
  178.         case 1:  Change2DParm(160,  0,159,127); break;
  179.         case 2:  Change2DParm(  0,128,159,127); break;
  180.         case 3:  Change2DParm(160,128,159,127); break;
  181.       }
  182.       PlotObj(envi,obs,ObjTab[i]);
  183.  
  184.       ReadObjCoord(ObjTab[i], &ra,&rs,&rt, &x,&y,&z);
  185.       ra+=vtpos[i][0];
  186.       rs+=vtpos[i][1];
  187.       rt+=vtpos[i][2];
  188.        x+=vtpos[i][3]; vtpos[i][3]=0;
  189.        y+=vtpos[i][4]; vtpos[i][4]=0;
  190.        z+=vtpos[i][5]; vtpos[i][5]=0;
  191.       PlaceObj(ObjTab[i], ra,rs,rt, x,y,z);
  192.     }
  193.  
  194.     x=y=z=ra=rs=rt=0;
  195.  
  196.     ReadMouse(&msx,&msy,&msbut);
  197.     msx-=msorgx;
  198.     msy-=msorgy;
  199.     SetMousePos(640,512);
  200.  
  201.     kbbut = Inkey();
  202.  
  203.     rt += (msx*stp);
  204.     rs += (msy*stp); 
  205.     if (msbut==0x01<<2) ra+=stp;
  206.     if (msbut==0x01<<0) ra-=stp;
  207.     switch (kbbut) {
  208.      case '+'     : z=+15; break;
  209.      case '-'     : z=-15; break;
  210.      case 'S' :v=0;ra=0;rs=0;rt=0;
  211.                for(i=0;i<4;i++) {
  212.                  vtpos[i][0]=0;
  213.                  vtpos[i][1]=0;
  214.                  vtpos[i][2]=0;
  215.                  vtpos[i][3]=0;
  216.                  vtpos[i][4]=0;
  217.                  vtpos[i][5]=0;
  218.                  PlaceObj(ObjTab[i], 0,0,0, 0,0,0);
  219.                }
  220.                break;
  221.     }
  222.     vtpos[curobj][0]+=ra;
  223.     vtpos[curobj][1]+=rs/128;
  224.     vtpos[curobj][2]+=rt/64;
  225.     vtpos[curobj][3]=x;
  226.     vtpos[curobj][4]=y;
  227.     vtpos[curobj][5]=z;
  228.  
  229.     switch (kbbut) {
  230.      case '1': curobj=0; break;
  231.      case '2': curobj=1; break;
  232.      case '3': curobj=2; break;
  233.      case '4': curobj=3; break;
  234.      case ' ': return(0);
  235.     }
  236.  
  237.     Change2DParm(0,0,319,255);
  238.  
  239.     GrpReg[0]=0;
  240.     GrpReg[1]=0;
  241.     GrpReg[2]=319;
  242.     GrpReg[3]=0;
  243.     GrpReg[8]=0xFF;
  244.     CallGrp(GrpReg,GrpStack,Uni2DPoly2);
  245.  
  246.     GrpReg[0]=0;
  247.     GrpReg[1]=128;
  248.     GrpReg[2]=319;
  249.     GrpReg[3]=128;
  250.     GrpReg[8]=0xFF;
  251.     CallGrp(GrpReg,GrpStack,Uni2DPoly2);
  252.  
  253.     GrpReg[0]=0;
  254.     GrpReg[1]=255;
  255.     GrpReg[2]=319;
  256.     GrpReg[3]=255;
  257.     GrpReg[8]=0xFF;
  258.     CallGrp(GrpReg,GrpStack,Uni2DPoly2);
  259.  
  260.     GrpReg[0]=0;
  261.     GrpReg[1]=0;
  262.     GrpReg[2]=0;
  263.     GrpReg[3]=255;
  264.     GrpReg[8]=0xFF;
  265.     CallGrp(GrpReg,GrpStack,Uni2DPoly2);
  266.  
  267.     GrpReg[0]=160;
  268.     GrpReg[1]=0;
  269.     GrpReg[2]=160;
  270.     GrpReg[3]=255;
  271.     GrpReg[8]=0xFF;
  272.     CallGrp(GrpReg,GrpStack,Uni2DPoly2);
  273.  
  274.     GrpReg[0]=319;
  275.     GrpReg[1]=0;
  276.     GrpReg[2]=319;
  277.     GrpReg[3]=255;
  278.     GrpReg[8]=0xFF;
  279.     CallGrp(GrpReg,GrpStack,Uni2DPoly2);
  280.  
  281.     SwapView(0x00000000);
  282.   }
  283.  
  284. }
  285.